Jackson হল একটি অত্যন্ত জনপ্রিয় এবং শক্তিশালী JSON লাইব্রেরি, যা Java objects এবং JSON এর মধ্যে রূপান্তর (serialization এবং deserialization) করতে ব্যবহৃত হয়। এর মূল অংশ ObjectMapper ক্লাস, যা JSON ডেটাকে Java objects-এ রূপান্তর করতে এবং Java objects-কে JSON ফরম্যাটে রূপান্তর করতে ব্যবহৃত হয়।
ObjectMapper কে কাস্টমাইজ করা অনেক ক্ষেত্রেই দরকার হয়, যাতে আপনি JSON ডেটাকে আপনার বিশেষ প্রয়োজন অনুযায়ী প্রক্রিয়া করতে পারেন, যেমন:
- Date formatting
- Property naming strategies
- Custom serializers/deserializers
- Handling missing properties
এখানে আমরা ObjectMapper কাস্টমাইজেশন এর কিছু সাধারণ টেকনিক আলোচনা করব।
1. ObjectMapper কাস্টমাইজেশন: বিভিন্ন কৌশল
1.1. Property Naming Strategy কাস্টমাইজ করা
Jackson ডিফল্টভাবে Java objects এর প্রপার্টি নামকে camelCase-এ রূপান্তর করে, কিন্তু আপনি এটি কাস্টমাইজ করতে পারেন, যেমন snake_case, PascalCase, বা অন্য কোনো স্টাইল।
How to Customize Property Naming Strategy:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
public class ObjectMapperExample {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
// Set custom property naming strategy
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
MyObject obj = new MyObject("John", "Doe");
String json = objectMapper.writeValueAsString(obj);
System.out.println(json); // {"first_name":"John","last_name":"Doe"}
}
}
class MyObject {
public String firstName;
public String lastName;
public MyObject(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
Explanation:
- PropertyNamingStrategies.SNAKE_CASE: Java objects এর camelCase প্রপার্টি নামগুলো snake_case-এ রূপান্তরিত হবে (যেমন
firstNameহবেfirst_name)।
Jackson আরও অন্যান্য naming strategies সমর্থন করে যেমন UPPER_CAMEL_CASE, LOWER_CASE, এবং custom naming strategies তৈরি করা সম্ভব।
1.2. Date Format কাস্টমাইজেশন
Jackson-এ Date টাইপ ফিল্ডগুলোকে JSON এ serialize এবং deserialize করার সময়, আপনি Date format কাস্টমাইজ করতে পারেন। এটি সাধারণত প্রয়োজন হয় যখন আপনার JSON ডেটায় তারিখের ফরম্যাট পরিবর্তন করতে হয় (যেমন yyyy-MM-dd বা dd/MM/yyyy )।
How to Customize Date Format:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.util.StdDateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ObjectMapperDateFormatExample {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
// Set custom date format
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
objectMapper.setDateFormat(dateFormat);
MyObjectWithDate obj = new MyObjectWithDate(new Date());
String json = objectMapper.writeValueAsString(obj);
System.out.println(json); // {"date":"2024-12-19"}
}
}
class MyObjectWithDate {
public Date date;
public MyObjectWithDate(Date date) {
this.date = date;
}
}
Explanation:
- এখানে, আমরা SimpleDateFormat ব্যবহার করে yyyy-MM-dd ফরম্যাটে তারিখ প্রদর্শন করতে Jackson এর setDateFormat() মেথড ব্যবহার করেছি।
1.3. Custom Serializer and Deserializer
Jackson আপনাকে custom serializers এবং deserializers তৈরি করার সুযোগ দেয়, যা বিশেষ ধরনের অবজেক্টের রূপান্তরের জন্য প্রয়োজনীয় হতে পারে।
How to Create Custom Serializer and Deserializer:
Custom Serializer:
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
class MyCustomSerializer extends JsonSerializer<MyObject> {
@Override
public void serialize(MyObject value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeStartObject();
gen.writeStringField("first_name", value.firstName);
gen.writeStringField("last_name", value.lastName);
gen.writeEndObject();
}
}
Custom Deserializer:
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import java.io.IOException;
class MyCustomDeserializer extends JsonDeserializer<MyObject> {
@Override
public MyObject deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
String[] parts = p.getText().split(",");
return new MyObject(parts[0], parts[1]);
}
}
Using Custom Serializer and Deserializer with ObjectMapper:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
public class ObjectMapperCustomSerializationExample {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
// Register custom serializer and deserializer
SimpleModule module = new SimpleModule();
module.addSerializer(MyObject.class, new MyCustomSerializer());
module.addDeserializer(MyObject.class, new MyCustomDeserializer());
objectMapper.registerModule(module);
MyObject obj = new MyObject("John", "Doe");
String json = objectMapper.writeValueAsString(obj);
System.out.println(json); // Custom serialized JSON
MyObject deserializedObj = objectMapper.readValue("John,Doe", MyObject.class);
System.out.println(deserializedObj.firstName + " " + deserializedObj.lastName); // John Doe
}
}
class MyObject {
public String firstName;
public String lastName;
public MyObject(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
Explanation:
- Custom Serializer:
MyCustomSerializerকাস্টম JSON সিরিয়ালাইজার যা MyObject ক্লাসের প্রপার্টি গুলিকে কাস্টম পদ্ধতিতে JSON এ রূপান্তর করে। - Custom Deserializer:
MyCustomDeserializerকাস্টম JSON ডেসিরিয়ালাইজার যা একটি কাস্টম স্ট্রিং ফরম্যাট থেকে MyObject তৈরি করে।
1.4. Handling Missing Properties
Jackson এ, আপনি যদি একটি Java object থেকে JSON তৈরি করেন, তবে কখনো কখনো কিছু প্রপার্টি missing হয়ে যেতে পারে বা উপেক্ষা করা হতে পারে। আপনি @JsonInclude এবং @JsonIgnore ব্যবহার করে এই আচরণ কাস্টমাইজ করতে পারেন।
How to Handle Missing Properties:
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonIgnore;
public class MyObjectWithMissingProperties {
@JsonInclude(JsonInclude.Include.NON_NULL) // Include only non-null values
public String name;
@JsonIgnore // Ignore this field during serialization
public String password;
}
Explanation:
- @JsonInclude:
NON_NULLঅপশন ব্যবহার করে আপনি শুধুমাত্র null নয় এমন প্রপার্টিগুলিকে JSON-এ অন্তর্ভুক্ত করতে পারেন। - @JsonIgnore: একটি প্রপার্টি বা ফিল্ড JSON সিরিয়ালাইজেশন/ডেসিরিয়ালাইজেশন থেকে উপেক্ষা করতে এই অ্যানোটেশন ব্যবহার করা হয়।
1.5. ObjectMapper Configuration for Pretty Print
JSON ডেটা যখন pretty print করতে চান (যে ফরম্যাটে মানুষ সহজে পড়তে পারে), তখন আপনি ObjectMapper এর মাধ্যমে এটি কাস্টমাইজ করতে পারেন।
How to Enable Pretty Print:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
public class ObjectMapperPrettyPrintExample {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
// Enable pretty print
objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
MyObject obj = new MyObject("John", "Doe");
String json = objectMapper.writeValueAsString(obj);
System.out.println(json); // Pretty printed JSON
}
}
Explanation:
- SerializationFeature.INDENT_OUTPUT: এটি JSON আউটপুটকে pretty print বা formatted করে দেয়, যেখানে প্রতিটি নতুন লাইন এবং ইনডেন্টেশন সঠিকভাবে থাকে।
- ObjectMapper হল Jackson এর কেন্দ্রবিন্দু এবং এটি JSON ডেটা Java objects এবং Java objects-কে JSON-এ রূপান্তর করতে ব্যবহৃত হয়।
- Jackson এর ObjectMapper কাস্টমাইজেশন থেকে আপনি property naming, date formatting, custom serializers/deserializers, pretty printing, এবং missing property handling সহ বিভিন্ন সুবিধা পেতে পারেন।
- এই কাস্টমাইজেশন ফিচারগুলির মাধ্যমে আপনি আপনার JSON প্রক্রিয়ার আচরণ নিয়ন্ত্রণ করতে পারবেন এবং আরও নমনীয় এবং কার্যকরী কোড তৈরি করতে পারবেন।
Jackson-এর ObjectMapper ব্যবহার করে আপনি খুব সহজেই এবং দক্ষতার সাথে JSON প্রক্রিয়া করতে পারেন, এবং এর কাস্টমাইজেশন ফিচারগুলির মাধ্যমে আপনি আপনার প্রোজেক্টের প্রয়োজনীয়তা অনুযায়ী এটি আরও শক্তিশালী করতে পারেন।
Read more